.MODEL small
.STACK

MPrintString macro string
	push ax
	push dx
	mov ah,09h
		mov dx,offset string
	int 21h
	pop dx
	pop ax
endm

MflushKeyBuffer macro
	push ax
	xor ax, ax			; flush keybuffer
		mov ah, 0Ch			
		int 21h
	pop ax
endm

MprintChar macro char
	push ax
		push dx
	xor ax, ax
	mov ah, 2
		mov dl, char
		int 21h
	pop dx
		pop ax
endm

.DATA
	beginl db 0Dh, 19 dup(' '), 0Dh, '$'
	machten10 dw 1000, 100, 10, 1
	oldnrticks dw 0
.CODEdir

.STARTUP
hoofdlus:
	xor ah, ah			; read system clock ticks
		int 1Ah
	mov bx, dx
	sub dx, oldnrticks	; 18,20 clock ticks per second = 0,05 s/ct
	cmp dx, 18			; 18 ticks ~ 1 second
	jb hoofdlus
	mov oldnrticks, bx
	MPrintString beginl
	mov ah, 2Ah			; vraag systeemdatum op
		int 21h
	push cx				; jaar
	call PrintCard4
	MprintChar '/'
	mov al, dh
	cbw
	push ax				; maand
	call PrintCard4
	MprintChar '/'
	mov al, dl
	cbw
	push ax				; dag
	call PrintCard4
	MprintChar ' '
	xor ax, ax
	mov ah, 2Ch			; vraag systeemtijd op
		int 21h
	mov al, ch
	cbw
	push ax				; uur
	call PrintCard4
	MprintChar ':'
	mov al, cl
	cbw
	push ax				; minuut
	call PrintCard4
	MprintChar ':'
	mov al, dh
	cbw
	push ax				; seconde
	call PrintCard4
	; mov ah, 86h			; wacht cx:dx microseconden
		; mov cx, 0Fh		; 1000000 microsec in cx:dx
		; mov dx, 4240h
		; int 15h
	mov ah, 01h
		int 16h			; zf=1, geen toets ingedrukt
	jz hoofdlus
; hoofdlus while (geen toets ingedrukt)
	
	MflushKeyBuffer
.EXIT

PrintCard4 proc near
	push bp				; save previous base pointer
	mov bp,sp			; update base pointer
	push ax				; saving context
		push dx
		push cx
		push si
		push di
	mov bx,[bp+4]		; get cardinal to print
	test bx, 0FFFFh
	jnz nietnul
	mov ah, 02h			; behandel welnul
		mov dl, '0'
		int 21h
	jmp gedaan
nietnul:
	mov si, offset machten10
volgendcijfer:
	cmp bx, [si]
	jge huidigcijfer
	add si, 2
	jmp volgendcijfer
huidigcijfer:
	mov ax, bx
	cwd
	div word ptr [si]	; deel door macht van 10, res in ax
	mov bx, dx			; rest in bx
	mov dl, al			; resultaat in dl
	add dl, 48			; cijfer naar ascii teken, print teken
		mov ah, 2
		int 21h	
	cmp word ptr [si], 1	; laatste cijfer?	
	je gedaan
	add si, 2
	jmp huidigcijfer
gedaan:
	pop di				; restore context
		pop si
		pop cx
		pop dx
		pop ax
    pop bp				; restore bp
    ret 4				; return and freeing param from stack (4 bytes)
PrintCard4 endp

end